<?php
/**
 * 
 * 日志处理类
 * @author yucy<yucy1985@gmail.com>
 *
 */
class YucyLogger
{
	/**
	 * 
	 * 严重错误, 导致系统崩溃无法使用
	 * @var string
	 */
    const EMERG = 'EMERG';
    
    /**
	 * 
	 * 警戒性错误, 必须被立即修改的错误
	 * @var string
	 */
    const ALERT = 'ALERT';
    
    /**
	 * 
	 * 临界值错误, 超过临界值的错误
	 * @var string
	 */
    const CRIT = 'CRIT';
    
    /**
	 * 
	 * 一般错误, 一般性错误
	 * @var string
	 */
    const ERR = 'ERR';
    
    /**
	 * 
	 * 警告性错误, 需要发出警告的错误
	 * @var string
	 */
    const WARN = 'WARN';
    
    /**
	 * 
	 * 通知, 程序可以运行但是还不够完美的错误
	 * @var string
	 */
    const NOTICE = 'NOTIC';
    
    /**
	 * 
	 * 信息, 程序输出信息
	 * @var string
	 */
    const INFO = 'INFO';
    
    /**
	 * 
	 * 调试信息
	 * @var string
	 */
    const DEBUG = 'DEBUG';
    
    
    public function __construct(){}
    
    
    public function err($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::ERR, $extra, $storageType);
    }
    
    
	public function emerg($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::EMERG, $extra, $storageType);
    }
    
    
	public function alert($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::ALERT, $extra, $storageType);
    }
    
    
	public function warn($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::WARN, $extra, $storageType);
    }
    
    
	public function notice($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::NOTICE, $extra, $storageType);
    }
    
    
	public function info($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::INFO, $extra, $storageType);
    }
    
    
	public function debug($message, $extra = '', $storageType = '')
    {
    	self::_save($message, self::DEBUG, $extra, $storageType);
    }


	/**
	 * 
	 * 自定义异常捕捉并写日志
	 * @param string $message
	 * @param int $code
	 */
	public static function exceptionHandler($message, $code = 0)
	{
		 self::_save("[$code] $message ", self::ERR);
	}


	/**
	 *
	 * 自定义错误处理
	 * @param int $errno 错误类型
	 * @param string $errstr 错误信息
	 * @param string $errfile 错误文件
	 * @param int $errline 错误行数
	 */
	public static function errorHandler($errno, $errstr, $errfile, $errline)
	{
		switch ($errno)
		{
			  case E_ERROR:
			  case E_USER_ERROR:
				$str_error = "[$errno] $errstr ".basename($errfile)." 第 $errline 行.";
				self::_save($str_error, self::ERR);
				break;
			  case E_STRICT:
			  case E_USER_WARNING:
			  case E_USER_NOTICE:
			  default:
				$str_error = "[$errno] $errstr ".basename($errfile)." 第 $errline 行.";
				self::_save($str_error, self::NOTICE);
				break;
		  }
	}
	
	
	/**
     *
     *  保存日志
     * @param string $message 日志信息
     * @param string $level  日志级别
     * @param string $extra 额外参数
     * @param string $storageType 存储类型
     * @return void
     */
	public function save($message, $level = self::ERR, $extra = '', $storageType = '')
	{
		return self::_save($message, $level, $extra, $storageType);
	}
	
	
	/**
     *
     *  保存日志
     * @param string $message 日志信息
     * @param string $level  日志级别
     * @param string $extra 额外参数
     * @param string $storageType 存储类型
     * @return void
     */
	private static function _save($message, $level = self::ERR, $extra = '', $storageType = '')
	{
		if (!$storageType) $storageType = YucyConfig::get('log_storage_type');
		
		return Yucy::getApp()->getHelper()->getLogger()->save($message, $level, $extra, $storageType);
	}
}